package com.wxy.ideaplugin.generator;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wxy.ideaplugin.utils.JdbcUtils;
import com.wxy.ideaplugin.utils.SwitchLineCamel;

import javax.swing.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MenuService extends Thread{
    private JTextArea execlog_textArea;
    private String softwareName;
    private JSONObject groupMenuJson;
    private List<Map<String,String>> tableInfoList;
    private String prefix;
    private String contextPath;
    private String module;
    private Map<String,String> tableNameZhDomainMap;

    public MenuService(String softwareName, JSONObject groupMenuJson, List<Map<String,String>> tableInfoList, String prefix, String contextPath, String module, Map<String,String> tableNameZhDomainMap, JTextArea execlog_textArea) {
        this.execlog_textArea = execlog_textArea;
        this.softwareName = softwareName;
        this.groupMenuJson = groupMenuJson;
        this.tableInfoList = tableInfoList;
        this.prefix = prefix;
        this.contextPath = contextPath;
        this.module = module;
        this.tableNameZhDomainMap = tableNameZhDomainMap;
    }

    public void run() {
        createMenu();
    }

    /**
     *  --- groupMenuJson ---
         {
             "用户管理": [
                 "用户",
                 "用户地址",
                 "用户购物车",
                 "用户订单",
                 "用户积分",
                 "用户评价",
                 "用户密码重置"
             ]
         }
     */
    public void createMenu() {
        execlog_textArea.append("#------- 生成菜单开始... -------;\n");
        //滚动尾部
        JScrollPane scrollPane1 = (JScrollPane)execlog_textArea.getParent().getParent();
        JScrollBar scrollBar=scrollPane1.getVerticalScrollBar();
        //tableName 与 tableNameZh 映射
        Map<String,String> tableNameMap = new HashMap<>();
        for (Map<String,String> tableInfoMap : tableInfoList) {
            String tableName = tableInfoMap.get("tableName");
            String tableNameZh = tableInfoMap.get("tableNameZh");
            tableNameMap.put(tableNameZh, tableName);
        }
        //一级菜单
        //long menuId1 = createMenu4GroupName(softwareName, 668L);
        long menuId1 = createMenu4GroupName(softwareName, null, true);
        //
        for (String key : groupMenuJson.keySet()) {
            //二级菜单 如：key = 用户管理
            long menuId2 = createMenu4GroupName(key, menuId1, false);
            JSONArray tableNameZhList = groupMenuJson.getJSONArray(key); //["用户", "用户地址", "用户购物车", "用户订单"]
            for (int i = 0; i < tableNameZhList.size(); i++) {
                String tableNameZh = (String) tableNameZhList.get(i);
                execlog_textArea.append("# ");
                execlog_textArea.append(tableNameZh);
                execlog_textArea.append(" ;\n");
                String tableName = tableNameMap.get(tableNameZh);
                String domain = tableNameZhDomainMap.get(tableNameZh);
                createMenuSingle(tableNameZh, tableName, domain, menuId2);
                //滚动尾部
                scrollBar.setValue(scrollBar.getMaximum());
            }
        }
        //滚动尾部
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        execlog_textArea.append("#------- 生成菜单完成 -------;\n\n\n");
        scrollBar.setValue(scrollBar.getMaximum());
    }

    private long createMenu4GroupName(String name, Long parentId, boolean hasIdInText){
        List paramList = null;
        String sqlInsert = "insert into tmpt_auth_menu(`text`, name_en, `sort`, auth, url , key_random, type, has_data_limit, a3menu_id) values(?,?,?,?,?,?,?,?,?)";
        //主菜单，表名
        paramList = new ArrayList();
        paramList.add(name); //text
        paramList.add(""); //name_en
        paramList.add(10000); //sort
        paramList.add(""); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(10); // type
        paramList.add(0); // has_data_limit
        paramList.add(parentId); // a3menu_id
        Long menuId = JdbcUtils.executeInsert(sqlInsert, paramList);
        //update text
        if (hasIdInText) {
            String sqlUpdate = "update tmpt_auth_menu set text=? where id=?";
            paramList = new ArrayList();
            paramList.add(name + "_" + menuId); //text
            paramList.add(menuId); //id
            JdbcUtils.executeUpdate(sqlUpdate, paramList);
        }
        //return id
        return menuId;
    }

    private void createMenuSingle(String tableNameZh, String tableName, String domain, long parentId) {
        String entityPath = "";
        String tableName_noPrefix = "";
        /*for (int i=0;i<tablePrefixs.length;i++) {
            String prefix = tablePrefixs[i];
            if(tableName.startsWith(prefix)) {
                tableName_noPrefix = tableName.replaceFirst(prefix, "");
                break;
            }
        }*/
        if(tableName.startsWith(prefix)) {
            tableName_noPrefix = tableName.replaceFirst(prefix, "");
        }
        entityPath = SwitchLineCamel.switch2Property(tableName_noPrefix).substring(0,1).toLowerCase()+SwitchLineCamel.switch2Property(tableName_noPrefix).substring(1);

        //查询菜单是否已存在
        String sqlQuery = "select * from tmpt_auth_menu where name_en=? and deleteflag=0";
        List paramList = new ArrayList();
        paramList.add(tableName);
        List<Map<String,Object>> resultList = JdbcUtils.executeQuery(sqlQuery, paramList);
        /*if (resultList.size()>0) {
            return;
        }*/

        //
        String sqlInsert = "insert into tmpt_auth_menu(`text`, name_en, `sort`, auth, url , key_random, type, has_data_limit, a3menu_id) values(?,?,?,?,?,?,?,?,?)";
        List<Long> menuIdList = new ArrayList<>();
        //主菜单，表名
        paramList = new ArrayList();
        paramList.add(tableNameZh); //text
        paramList.add(tableName); //name_en
        paramList.add(0); //sort
        paramList.add(""); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(10); // type
        paramList.add(0); // has_data_limit
        paramList.add(parentId); // a3menu_id
        Long menuId = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId);
        //功能菜单，"List"
        paramList = new ArrayList();
        paramList.add(tableNameZh); //text
        paramList.add(entityPath+"-List"); //name_en
        paramList.add(0); //sort
        paramList.add(""); // auth
        //paramList.add("coding/shop/order/productCategory/list"); // url
        paramList.add("coding/"+contextPath+"/"+module+"/"+domain+"/"+entityPath+"/list"); // url
        paramList.add(""); // key_random
        paramList.add(10); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId); // a3menu_id
        Long menuId_list = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_list);
        //权限菜单（查询）
        paramList = new ArrayList();
        paramList.add("查询"); //text
        paramList.add(""); //name_en
        paramList.add(0); //sort
        paramList.add(module+":"+domain+":"+entityPath+":query"); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(20); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId_list); // a3menu_id
        Long menuId_fun1 = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_fun1);
        //权限菜单（添加）
        paramList = new ArrayList();
        paramList.add("添加"); //text
        paramList.add(""); //name_en
        paramList.add(0); //sort
        paramList.add(module+":"+domain+":"+entityPath+":create"); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(20); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId_list); // a3menu_id
        Long menuId_fun2 = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_fun2);
        //权限菜单（修改）
        paramList = new ArrayList();
        paramList.add("修改"); //text
        paramList.add(""); //name_en
        paramList.add(0); //sort
        paramList.add(module+":"+domain+":"+entityPath+":update"); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(20); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId_list); // a3menu_id
        Long menuId_fun3 = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_fun3);
        //权限菜单（删除）
        paramList = new ArrayList();
        paramList.add("删除"); //text
        paramList.add(""); //name_en
        paramList.add(0); //sort
        paramList.add(module+":"+domain+":"+entityPath+":delete"); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(20); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId_list); // a3menu_id
        Long menuId_fun4 = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_fun4);
        //权限菜单（报表）
        paramList = new ArrayList();
        paramList.add("报表下载"); //text
        paramList.add(""); //name_en
        paramList.add(0); //sort
        paramList.add(module+":"+domain+":"+entityPath+":report"); // auth
        paramList.add(""); // url
        paramList.add(""); // key_random
        paramList.add(20); // type
        paramList.add(0); // has_data_limit
        paramList.add(menuId_list); // a3menu_id
        Long menuId_fun5 = JdbcUtils.executeInsert(sqlInsert, paramList);
        menuIdList.add(menuId_fun5);

        //给管理员权限
        String sqlRole = "insert into tmpt_auth_menu_my(a2role_id, a3menu_id, data_limit_type) values(?,?,?)";
        for (Long menuId_tmp:menuIdList) {
            paramList = new ArrayList();
            paramList.add(1); //a2role_id
            paramList.add(menuId_tmp); //a3menu_id
            paramList.add(0); // data_limit_type
            JdbcUtils.executeInsert(sqlRole, paramList);
        }

    }

}
